function add(a, b, fc) {

    return fc(a) + fc(b);
}

var x = add(-1, 4, Math.abs)

console.log(x);






function add(o) {

    return o * o;
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
var d = arr.map(add)
console.log(d);






function add(o) {

    return o * o;
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]

for (let i = 0; i < arr.length; i++) {

    console.log(add(arr[i]));

}




console.log(arr.map(String));





var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
arr.reduce(function fc(x, y) {

    console.log(x + y);
    return x + y;
})





function product(arr) {
    var j = arr.reduce(function(x, y) {
        return x * y;
    })
    return j;
}

// 测试:
if (product([1, 2, 3, 4]) === 24 && product([0, 1, 2]) === 0 && product([99, 88, 77, 66]) === 44274384) {
    console.log('测试通过!');
} else {
    console.log('测试失败!');
}



var ad = [2, 6, 4, 8, 10]

var ll = ad.reduce(function(x, y) {

    return (x * 10) + y;
})

console.log(ll);







//filter
//例如，在一个Array中，删掉偶数，只保留奇数，可以这么写：
var kk = [1, 23, 44, 5, 82, 89, 80, ]
var h = kk.filter(function fc(x) {

    return x % 2 !== 0

})

console.log(h);




// 把一个Array中的空字符串删掉，可以这么写：
var arr = ['A', '', 'B', null, undefined, 'C', '  ']
var w = arr.filter(function fc(s) {
    return s && s.trim();; // 注意：IE9以下的版本没有trim()方法
    //     trim() 方法用于删除字符串的头尾空白符，空白符包括：空格、制表符 tab、换行符等其他空白符等。
    // trim() 方法不会改变原始字符串。
    // trim() 方法不适用于 null, undefined, Number 类型。
})


console.log(w);
//回调函数

// filter()接收的回调函数，其实可以有多个参数。通常我们仅使用第一个参数，
// 表示Array的某个元素。回调函数还可以接收另外两个参数，表示元素的位置和数组本身：
var arr = ['海绵宝宝', '派大星', '章鱼哥'];

var bb = arr.filter(function fc(item, index, self) {

    console.log(item); // 依次打印'海绵宝宝', '派大星', '章鱼哥'
    console.log(index); // 依次打印0, 1, 2
    console.log(self); // 依次打印arr

    return true;
})

// 利用filter，可以巧妙地去除Array的重复元素：
var arr = ['海绵宝宝', '章鱼哥', '派大星', '章鱼哥'];

var bb = arr.filter(function fc(item, index, self) {



    return self.indexOf(item) === index;
})
console.log(bb);





// 如果我们继续改进这个例子，想办法把一个字符串13579先变成Array——[1, 3, 5, 7, 9]，再利用reduce()就可以写出一个把字符串转换为Number的函数。

// 练习：不要使用JavaScript内置的parseInt()函数，利用map和reduce操作实现一个string2int()函数：

'use strict';
var f = function (x) {
    return x * x;
};
 
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = [];
for (var i=0; i<arr.length; i++) {
    result.push(f(arr[i]));
}

// 测试:
if (string2int('0') === 0 && string2int('12345') === 12345 && string2int('12300') === 12300) {
    if (string2int.toString().indexOf('parseInt') !== -1) {
        console.log('请勿使用parseInt()!');
    } else if (string2int.toString().indexOf('Number') !== -1) {
        console.log('请勿使用Number()!');
    } else {
        console.log('测试通过!');
    }
} else {
    console.log('测试失败!');
}



// 去除重复元素依靠的是indexOf总是返回第一个元素的位置，后续的重复元素位置与indexOf返回的位置不相等，因此被filter滤掉了。

// 练习 请尝试用filter()筛选出素数：

'use strict';

function get_primes(arr) {
    return arr.filter(function fc(x, y) {

        return x = 1 * x && y / x !== 0

    })
}

// 测试:
var
    x,
    r,
    arr = [];
for (x = 1; x < 100; x++) {
    arr.push(x);
}
r = get_primes(arr);
if (r.toString() === [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97].toString()) {
    console.log('测试通过!');
} else {
    console.log('测试失败: ' + r.toString());
}





// 练习 请把用户输入的不规范的英文名字，变为首字母大写，其他小写的规范名字。输入：['adam', 'LISA', 'barT']，输出：['Adam', 'Lisa', 'Bart']。

'use strict';
var array =['adam', 'LISA', 'barT'];
var array2=array.map(function(Value){
     return Value.replace(Value[0],Value[0].toUpperCase());
});
console.log(array2);

// 测试:
if (normalize(['adam', 'LISA', 'barT']).toString() === ['Adam', 'Lisa', 'Bart'].toString()) {
    console.log('测试通过!');
} else {
    console.log('测试失败!');
}



// 小明希望利用map()把字符串变成整数，他写的代码很简洁：

'use strict';
'use strict';

var arr = ['1', '2', '3'];
  console.log(arr.map(Number));



    var arr = ['1', '2', '3'];
var r;
r = arr.map(function parseInt2(x) {
    return parseInt(x);
});
console.log(r);

//  arr.map(parseInt);parseInt 函数将其第一个参数转换为字符串，解析它，并返回一个整数或NaN。
//如果不是NaN，返回的值将是作为指定基数（基数）中的数字的第一个参数的整数。
